﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Data.Entity;
using System.Text;
using System.Transactions;

using SIGCBI.WebMVC4.Models;
using SIGCBI.Entities;
using SIGCBI.BusinessLogic;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
using System.Security.Cryptography;

namespace SIGCBI.WebMVC4.Controllers
{
    public class FuenteFinancieraController : Controller
    {
        [Dependency]
        public IFuenteFinancieraBL fuenteFinancieraBL { get; set; }

        [Dependency]
        public ICentroCostoBL centroCostoBL { get; set; }

        [Dependency]
        public IPartidaBL partidaBL { get; set; }

        public ActionResult Index()
        {
            var fuente = fuenteFinancieraBL.GetAllFromFuenteFinanciera();
            return View(fuente);
        }

        [HttpPost]
        public ActionResult Index(string codigo = "", string nombre = "")
        {
            var criterio = "";
            if (codigo != string.Empty)
            {
                criterio = codigo;
            }
            else if (nombre != string.Empty)
            {
                criterio = nombre;
            }

            var fuente = fuenteFinancieraBL.GetFromFuenteFinancieraByCriterio(criterio);
            return View(fuente);
        }

        public ActionResult Create()
        {
            var centro = centroCostoBL.GetAllFromArea();
            ViewData["IdCentroCosto"] = new SelectList(centro, "ID", "Descripcion");

            return PartialView();
        }

        [HttpPost]
        public ActionResult Create(FUENTE_FINANCIERA fuenteFinanciera, FormCollection colection)
        {
            //fuenteFinanciera.IdCentroCosto = colection["IdCentroCosto"].ToString() == "" ? 0 : Int32.Parse(colection["IdCentroCosto"].ToString());

            if (ModelState.IsValid)
            {
                var _fuente = fuenteFinancieraBL.ValidarDuplicidadFuenteFinanciera(fuenteFinanciera.Codigo, fuenteFinanciera.Id);

                if (_fuente == null)
                {
                    fuenteFinancieraBL.AddFuenteFinanciera(fuenteFinanciera);
                    return this.DialogResult("Registro Correcto");
                }
                else
                    ModelState.AddModelError("", string.Format("Ya existe una Fuente Financiera con la misma Información"));
            }
            return PartialView(fuenteFinanciera);
        }

        public ActionResult Edit(int id = 0)
        {
            if (id == 0)
                return this.DialogResult();

            var _fuente = fuenteFinancieraBL.GetFromFuenteFinancieraById(id);

            if (_fuente == null)
                return this.DialogResult();

            var centro = centroCostoBL.GetAllFromArea();
            ViewData["IdCentroCosto"] = new SelectList(centro, "ID", "Descripcion", _fuente.IdCentroCosto);

            return PartialView("Edit", _fuente);
        }

        [HttpPost]
        public ActionResult Edit(int id, FUENTE_FINANCIERA fuente, FormCollection colection)
        {
            //fuente.IdCentroCosto = colection["IdCentroCosto"].ToString() == "" ? 0 : Int32.Parse(colection["IdCentroCosto"].ToString());

            if (ModelState.IsValid)
            {
                var _fuente = fuenteFinancieraBL.ValidarDuplicidadFuenteFinanciera(fuente.Codigo, fuente.Id);

                if (_fuente == null)
                {
                    fuenteFinancieraBL.UpdateFuenteFinanciera(fuente);
                    return this.DialogResult("Modificacion Correcta");  // Close dialog via DialogResult call
                }
                else
                    ModelState.AddModelError("", string.Format("Ya existe una Fuente Financiera con el mismo Código"));
            }
            return PartialView(fuente);
        }

        public ActionResult Details(int id = 0)
        {
            if (id == 0)
                return this.DialogResult();

            var _fuente = fuenteFinancieraBL.GetFromFuenteFinancieraById(id);
            if (_fuente == null)
                return this.DialogResult();

            return PartialView("Details", _fuente);
        }

        public ActionResult ViewDetails(int idFuente)
        {
            var detalle = fuenteFinancieraBL.GetFromDetalleFuenteFinancieraByIdFuente(idFuente);

            return PartialView("ViewDetails", detalle);
        }

        public ActionResult AsignarPartidaAFuente()
        {
            var centro = centroCostoBL.GetAllFromArea();
            ViewData["cmbCentros"] = new SelectList(centro, "ID", "Descripcion");
            
            ViewData["cmbFuentes"] = new SelectList(new[] { "Seleccione" });
            return View();
        }

        [HttpPost]
        public ActionResult AsignarPartidaAFuente(DETALLE_PARTIDA Detalle)
        {
            var Success = false;
            var Message = "";
            try
            {
                if (Detalle.IdFuenteFinanciera != 0)
                {
                    var presupuesto = fuenteFinancieraBL.GetFromFuenteFinancieraById(Detalle.IdFuenteFinanciera).Presupuesto;
                    var gastos = partidaBL.GetFromDetallePartidaByIdFuente(Detalle.IdFuenteFinanciera).Sum(d => d.MontoAsignado) == null ? 0 : partidaBL.GetFromDetallePartidaByIdFuente(Detalle.IdFuenteFinanciera).Sum(d => d.MontoAsignado);

                    if (Detalle.IdPartida != 0)
                    {
                        if (Detalle.MontoAsignado <= (presupuesto - gastos))
                        {
                            partidaBL.AddDetallePartida(Detalle);
                            Message = "Registro Correcto";
                            Success = true;
                        }
                        else
                            Message = "El monto asignado excede el Presupesto";
                    }
                    else
                        Message = "Seleccione una Partida Presupuestaria";
                }
                else
                    Message = "Seleccione una Fuente de Financiamiento";
            }
            catch (Exception ex)
            {
                Message = ex.Message;
            }

            return Json(new { success = Success, message = Message }, JsonRequestBehavior.AllowGet);
        }

        public ActionResult GetAllCentros()
        {
            var centros = centroCostoBL.GetAllFromArea();
            return Json(new SelectList(centros, "Id", "Descripcion"), JsonRequestBehavior.AllowGet);
        }

        public ActionResult GetFuentesPorCentro(int id)
        {
            var fuentes = fuenteFinancieraBL.GetAllFromFuenteFinanciera().Where(f => f.IdCentroCosto == id);
            return Json(new SelectList(fuentes, "Id", "Descripcion"), JsonRequestBehavior.AllowGet);
        }

        public ActionResult GetFuentesById(int id)
        {
            var sumFuentes = partidaBL.GetFromDetallePartidaByIdFuente(id).Sum(d => d.MontoAsignado);
            var fuente = fuenteFinancieraBL.GetFromFuenteFinancieraById(id);

            var result = new { presupuesto = fuente.Presupuesto, saldo = fuente.Presupuesto - sumFuentes };
            return Json(result, JsonRequestBehavior.AllowGet);
        }


        public ActionResult GetPartidasPorFuente(int id)
        {
            var partidas = partidaBL.GetFromDetallePartidaByIdFuente(id);

            return Json(new SelectList(partidas, "IdPartida", "PARTIDA.Nombre"), JsonRequestBehavior.AllowGet);
        }

        public ActionResult GetPartidaById(int id)
        {
            var partida = partidaBL.GetFromPartidaById(id);

            var result = new { Codigo = partida.Codigo, Monto = partida.Presupuesto };
            return Json(result, JsonRequestBehavior.AllowGet);
        }

        public ActionResult SearchPartida(string nombrePartida)
        {
            //var gastos = partidaBL.GetAllGastosFromReducirPresupuestoByIdPartida(1);
            var result = partidaBL.GetAllFromPartidas()
                .Where(r => r.Nombre.ToUpper().StartsWith(nombrePartida.ToUpper())
                    || r.Nombre.ToUpper().Contains(nombrePartida.ToUpper()))
                .Take(10)
                .Select(r => new { id = r.Id, label = r.Nombre, saldo = r.Presupuesto - r.REDUCIR_PRESUPUESTO.Sum(a => a.Monto), name = "Id_Partida" });
                //.Select(r => new { id = r.Id, label = r.Nombre, saldo = r.Saldo, name = "Id_Partida" });

            return Json(result, JsonRequestBehavior.AllowGet);
        }

        public ActionResult CambiarPresupuesto()
        {
            var centro = centroCostoBL.GetAllFromArea();
            ViewData["cmbCentrosOrigen"] = new SelectList(centro, "ID", "Descripcion");
            ViewData["cmbFuentesOrigen"] = new SelectList(new[] { "Seleccione" });
            ViewData["cmbPartidasOrigen"] = new SelectList(new[] { "Seleccione" });

            ViewData["cmbCentrosDestino"] = new SelectList(centro, "ID", "Descripcion");
            ViewData["cmbFuentesDestino"] = new SelectList(new[] { "Seleccione" });
            ViewData["cmbPartidasDestino"] = new SelectList(new[] { "Seleccione" });
            return View();
        }

        [HttpPost]
        public ActionResult CambiarPresupuesto(CAMBIO_PARTIDAS Modelo)
        {
            var Success = false;
            var Message = "";
            try
            {
                if (Modelo.IdOrigen != 0)
                {
                    if (Modelo.IdDestino != 0)
                    {
                        if (!string.IsNullOrEmpty(Modelo.NroResolucion))
                        {
                            if (Modelo.Monto != 0)
                            {
                                Modelo.Fecha = DateTime.Now;
                                partidaBL.AddCambioPartida(Modelo);
                                Message = "Registro Correcto";
                                Success = true;
                            }
                            else
                                Message = "El monto debe ser mayor a 0";
                        }
                        else
                            Message = "Ingrese un número de documento";
                    }
                    else
                        Message = "Seleccione una Partida Presupuestaria Destino";
                }
                else
                    Message = "Seleccione una Partida Presupuestaria Origen";
            }
            catch (Exception ex)
            {
                Message = ex.Message;
            }

            return Json(new { success = Success, message = Message }, JsonRequestBehavior.AllowGet);
        }


        public ActionResult ReducirPresupuesto()
        {
            var centro = centroCostoBL.GetAllFromArea();
            ViewData["cmbCentros"] = new SelectList(centro, "ID", "Descripcion");

            ViewData["cmbFuentes"] = new SelectList(new[] { "Seleccione" });
            ViewData["cmbPartidas"] = new SelectList(new[] { "Seleccione" });
            ViewData["cmbComprobante"] = new SelectList(new[] { "Seleccione", "Boleta", "Factura" });

            return View();
        }

        [HttpPost]
        public ActionResult ReducirPresupuesto(REDUCIR_PRESUPUESTO Modelo)
        {
            var Success = false;
            var Message = "";
            try
            {
                if (!string.IsNullOrEmpty(Modelo.TipoDoc))
                {
                    if (!string.IsNullOrEmpty(Modelo.NroDoc))
                    {
                        if (Modelo.IdPartida != 0)
                        {
                            if (Modelo.Monto != 0)
                            {
                                Modelo.Fecha = DateTime.Now;
                                partidaBL.AddReducirPartida(Modelo);
                                Message = "Registro Correcto";
                                Success = true;
                            }
                            else
                                Message = "El monto debe ser mayor a 0";
                        }
                        else
                            Message = "Seleccione una Partida Presupuestaria";
                    }
                    else
                        Message = "Ingrese un Número de Documento";
                }
                else
                    Message = "Seleccione un Tipo de Comprobante";


            }
            catch (Exception ex)
            {
                Message = ex.Message;
            }

            return Json(new { success = Success, message = Message }, JsonRequestBehavior.AllowGet);
        }

    }
}
